#include <sys/time.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

long app_common_getCurrentTime()
{
    // 声明用于保存时间数据的结构体
    struct timeval tv;
    // 获取当前时间
    gettimeofday(&tv, NULL);
    // 返回当前时间（秒）
    return tv.tv_sec*1000 + tv.tv_usec/1000;
    // tv_sec: 秒  tv_usec: 微秒
}

/**
 * @brief 将字符数组转换为对应的十六进制字符串
 */
char *app_common_charsToHexstr(char *chars, int chars_len)
{
    // abcd => "61626364"
    // 申请十六进制字符串的内存空间
    char *hexstr = (char *)malloc(chars_len * 2 + 1);
    // 遍历chars中的每个字符，转换为2个十六进制字符，并存入hexstr中
    for (int i = 0; i < chars_len; i++) {
        sprintf(hexstr+i*2, "%02x", chars[i]);
    }
    // 添加字符串结束符
    hexstr[chars_len*2] = '\0';

    // 返回十六进制字符串
    return hexstr;
}

/**
 * @brief 将十六进制字符串转换为对应的字符数组
 */
char *app_common_hexstrToChars(char *hexstr, int *chars_len)
{
    // 十六进制字符串长度
    int hexstr_len = strlen(hexstr);
    // 保存字符数组的长度
    *chars_len = hexstr_len / 2;

    // 申请字符数组的内存空间
    char *chars = (char *)malloc(*chars_len);
    // 以2个单位遍历十六进制字符串中的每个字符，转换为对应的字符，并存入chars中
    // 61626364 => abcd
    for (int i = 0; i < hexstr_len-1; i=i+2)
    {
        sscanf(hexstr+i, "%02x", (unsigned int *)(chars+i/2));
    }

    // 返回字符数组
    return chars;
    
}